package com.rt.gptnext.common.exception;

import cn.hutool.core.util.ReflectUtil;

import java.util.function.Supplier;

/**
 * 结果码参数
 *
 * @author gaoyiyang
 **/
public interface IResultCode {

    /**
     * 获取消息
     *
     * @return 消息
     */
    String getMessage();

    /**
     * 异常类型
     *
     * @return -
     */
    default Class<? extends BusinessException> exceptionClass() {
        return BusinessException.class;
    }

    /**
     * 获取编码
     *
     * @return 编码
     */
    default String getCode() {
        if (this instanceof Enum) {
            return ((Enum<?>) this).name();
        }
        return null;
    }

    /**
     * 创建异常
     *
     * @return -
     */
    default BusinessException exception() {
        return ReflectUtil.newInstance(exceptionClass(), this);
    }

    /**
     * 创建异常
     *
     * @param message 异常信息
     * @return -
     */
    default BusinessException exception(String message) {
        if (message == null) {
            return exception();
        }
        return ReflectUtil.newInstance(exceptionClass(), this, message);
    }

    /**
     * 抛出异常
     */
    default void throwException() {
        throw exception();
    }

    /**
     * 抛出异常
     *
     * @param message 异常信息
     */
    default void throwException(String message) {
        throw exception(message);
    }

    /**
     * 获取异常提供者
     *
     * @return -
     */
    default Supplier<BusinessException> supplier() {
        return this::exception;
    }

    /**
     * 获取异常提供者
     *
     * @param message 异常信息
     * @return -
     */
    default Supplier<BusinessException> supplier(String message) {
        return () -> exception(message);
    }

}
